package estacion.acciones;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.JOptionPane;

import com.opensymphony.xwork2.ActionSupport;

import estacion.dominio.Autobus;
import estacion.dominio.Conductor;
import estacion.dominio.Estacion;
import estacion.dominio.Linea;
import estacion.dominio.Persona;
import estacion.dominio.Producto;
import estacion.dominio.Revisor;
import estacion.dominio.Taxi;
import estacion.dominio.Tienda;
import estacion.dominio.Trabajador;
import estacion.dominio.Tramo;
import estacion.dominio.Tren;
import estacion.dominio.Vehiculo;
import estacion.dominio.Vendedor;
import estacion.persistencia.Consultas_generales;

public class GestorDatosVehiculos extends ActionSupport {

	private static final long serialVersionUID = 1L;
	private List<Vehiculo> taxis;
	private Taxi taxi;
	private List<Vehiculo> trenes;
	private Tren tren;
	private List<Vehiculo> autobuses;
	private Autobus autobus;
	
	//variables de modificacion
	private String Codigo_vehiculo;
	private String Licencia;
	private int Capacidad;
	private String matricula;
	private String marca;
	private String modelo;
	private String linea;
	private String nueva_linea;
	
	//varaibles de insercion
	private String Codigo_vehiculo1;
	private String Licencia1;
	private int Capacidad1;
	private String matricula1;
	private String marca1;
	private String modelo1;
	private int linea1;
	private String nombre_linea;
	
	private int operacion;
	private boolean insertado_v;
	private boolean existe_v;
	private boolean vacio_v;
	private boolean modif_v;
	private boolean elim_v;
	private ArrayList<String> veh;
	private ArrayList<String> tie;
	private ArrayList<String> lin;
	private ArrayList<String> lic;
	
	@Override
	public String execute() throws Exception {
		try {
			this.taxi=new Taxi();
			this.autobus=new Autobus();
			this.tren=new Tren();
			if(this.operacion==Constantes.BUSCART){
				taxis=taxi.getVehiculos();
				setLicencia("taxi");
			}else if(this.operacion==Constantes.BUSCARA){
				autobuses=autobus.getVehiculos();
				setLicencia("bus");
			}else if(this.operacion==Constantes.BUSCARTR){
				trenes=tren.getVehiculos();
				setLicencia("tren");
			}else if(this.operacion==Constantes.MODIFICAR){
				if(puedo1()){
					modificar();
					modif_v=true;
				}
			}else if(this.operacion==Constantes.ANADIR){
				if(taxi.consultarVehiculo(this.getCodigo_vehiculo1())==null||
					tren.consultarVehiculo(this.getCodigo_vehiculo1())==null||
					autobus.consultarVehiculo(this.getCodigo_vehiculo1())==null){
					if(puedo()){
						this.insertarVehiculo();
						insertado_v=true;
					}else vacio_v=true;
				}else existe_v=true;
				
			}else if(this.operacion==Constantes.ELIMINAR){
				if(puedo1()){
					eliminarVehiculo();
					elim_v=true;
				}
			}
			
		}
		catch (Exception e) {
		
		}	
		return SUCCESS;
    }
	
	private boolean puedo() {
		boolean puedo=true;
		if(this.getLicencia1().equals("")) puedo=false;
		if(!this.getLicencia1().equals("taxi"))if(this.getNombre_linea().equals("--")) puedo=false;
		if(this.Capacidad1<=0)puedo=false;
		return puedo;
	}
	
	private boolean puedo1(){
		boolean puedo=true;
		if(this.getCodigo_vehiculo().equals("")) puedo=false;
		return puedo;
	}

	private void eliminarVehiculo() throws Exception {
		Producto pr=new Producto();
		if(this.Licencia.equals("taxi")){
			taxi.eliminarVehiculo(getCodigo_vehiculo());
		}else if(this.Licencia.equals("bus")){
			Linea li=new Linea();
			pr.eliminarBillete(li.consultarLinean(this.linea).getCodigo_linea());	
			autobus.eliminarVehiculo(getCodigo_vehiculo());
		}else if(this.Licencia.equals("tren")){
			Linea li=new Linea();
			pr.eliminarBillete(li.consultarLinean(this.linea).getCodigo_linea());	
			tren.eliminarVehiculo(getCodigo_vehiculo());
		}
		
	}

	private void insertarVehiculo() throws Exception {
		if(this.Licencia1.equals("taxi")){
			Taxi taxi1=new Taxi();
			taxi1.setCodigo_vehiculo(this.Codigo_vehiculo1);
			taxi1.set_Licencia_necesitada(this.Licencia1);
			taxi1.set_capacidadPersonas(this.Capacidad1);
			taxi1.set_Marca(this.marca1);
			taxi1.set_Matricula(this.matricula1);
			taxi1.set_Modelo(this.modelo1);
			taxi1.insertarVehiculo();
		}else if(this.Licencia1.equals("bus")){
			Autobus autobus1=new Autobus();
			autobus1.setCodigo_vehiculo(this.Codigo_vehiculo1);
			autobus1.set_Licencia_necesitada(this.Licencia1);
			autobus1.set_capacidadPersonas(this.Capacidad1);
			Linea line=new Linea();
			line=line.consultarLinean(nombre_linea);
			autobus1.setLinea(line);
			autobus1.set_Marca(this.marca1);
			autobus1.set_Matricula(this.matricula1);
			autobus1.set_Modelo(this.modelo1);
			autobus1.insertarVehiculo();
		}else if(this.Licencia1.equals("tren")){
			Tren tren1=new Tren();
			tren1.setCodigo_vehiculo(this.Codigo_vehiculo1);
			tren1.set_Licencia_necesitada(this.Licencia1);
			tren1.set_capacidadPersonas(this.Capacidad1);
			Linea line=new Linea();
			line=line.consultarLinean(nombre_linea);
			tren1.setLinea(line);
			tren1.set_Marca(this.marca1);
			tren1.set_Matricula(this.matricula1);
			tren1.set_Modelo(this.modelo1);
			tren1.insertarVehiculo();
		}
	}

	private void modificar() throws Exception {
		taxi=(Taxi)taxi.consultarVehiculo(getCodigo_vehiculo());
		autobus=(Autobus) autobus.consultarVehiculo(getCodigo_vehiculo());
		tren=(Tren) tren.consultarVehiculo(getCodigo_vehiculo());
		if(taxi!=null&&taxi.get_Licencia_necesitada().equals("taxi")){
			taxi.set_capacidadPersonas(this.Capacidad);
			taxi.set_Marca(this.marca);
			taxi.set_Matricula(this.matricula);
			taxi.set_Modelo(this.modelo);
			taxi.modificarVehiculo();
		}else if(autobus!=null&&autobus.get_Licencia_necesitada().equals("bus")){
			Producto pr=new Producto();
			pr.eliminarBillete(autobus.getLinea().getCodigo_linea());	
			autobus.set_capacidadPersonas(this.Capacidad);
			autobus.set_Marca(this.marca);
			autobus.set_Matricula(this.matricula);
			autobus.set_Modelo(this.modelo);
			Linea line=new Linea();
			line=line.consultarLinean(nueva_linea);
			autobus.setLinea(line);
			Tramo t=new Tramo();
			int tramos=t.consultarTramos(line.getCodigo_linea());
			int linea=line.getCodigo_linea();
			int cantidad=autobus.get_capacidadPersonas();
			while(tramos>0){
				pr.setCodigo_tienda(4);
				pr.setProveedor("Aisa");
				pr.setTipo("Billete"+linea+"_"+tramos);
				pr.setCantidad_producto(cantidad);
				pr.setCodigo_linea(linea);
				pr.setCodigo_tramo(tramos);
				pr.setPrecio(150/tramos);
				pr.insertBillete();
				tramos--;
			}
		
			autobus.modificarVehiculo();
		}else if(tren!=null&&tren.get_Licencia_necesitada().equals("tren")){
			Producto pr=new Producto();
			pr.eliminarBillete(tren.getLinea().getCodigo_linea());	
			tren.set_capacidadPersonas(this.Capacidad);
			tren.set_Marca(this.marca);
			tren.set_Matricula(this.matricula);
			tren.set_Modelo(this.modelo);
			Linea line=new Linea();
			line=line.consultarLinean(nueva_linea);
			tren.setLinea(line);
			Tramo t=new Tramo();
			int tramos=t.consultarTramos(line.getCodigo_linea());
			int linea=line.getCodigo_linea();
			int cantidad=tren.get_capacidadPersonas();
			while(tramos>0){
				pr.setCodigo_tienda(4);
				pr.setProveedor("Renfe");
				pr.setTipo("Billete"+linea+"_"+tramos);
				pr.setCantidad_producto(cantidad);
				pr.setCodigo_linea(linea);
				pr.setCodigo_tramo(tramos);
				pr.setPrecio(150/tramos);
				pr.insertBillete();
				tramos--;
			}
			tren.modificarVehiculo();
		}
					
	}
	
	public void setOperacion(String operacion) {
		if (operacion.equalsIgnoreCase("Buscar_taxis"))
			this.operacion = Constantes.BUSCART;
		else if (operacion.equalsIgnoreCase("Buscar_trenes"))
			this.operacion = Constantes.BUSCARTR;
		else if (operacion.equalsIgnoreCase("Buscar_autobuses"))
			this.operacion = Constantes.BUSCARA;
		else if (operacion.equalsIgnoreCase("Modificar"))
			this.operacion=Constantes.MODIFICAR;
		else if(operacion.equalsIgnoreCase("Cargar datos"))
			this.operacion=Constantes.CARGAR;
		else if(operacion.equalsIgnoreCase("Anadir"))
			this.operacion=Constantes.ANADIR;
		else if(operacion.equalsIgnoreCase("Eliminar"))
			this.operacion=Constantes.ELIMINAR;
	}
	
	public List<String> estaciones() throws Exception {
		Estacion e = new Estacion();
		List<Estacion> aux = e.getEstaciones();
		List<String> estaciones = new ArrayList<String>();
		for(int i=0; i<aux.size();i++) estaciones.add(aux.get(i).getEstacion());
		
		return estaciones;
	}
	
	public ArrayList<Integer> codigos_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<Integer> codigos = new ArrayList<Integer>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) codigos.add(lineas.get(i).getCodigo_linea());
		
		return codigos;
	}
	
	public ArrayList<String> nombres_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) nombres.add(lineas.get(i).getnombre());
		
		return nombres;
	}
	
	public ArrayList<String> nombres_lineas_sin() throws Exception{
		Linea lin = new Linea();
		Tren t = new Tren();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++){
			if(t.consultarVehiculoLinea(lineas.get(i).getCodigo_linea()) == null){
				nombres.add(lineas.get(i).getnombre());
			}
		}
		
		return nombres;
	}
	
	public List<Vehiculo> getTaxis() {
		return taxis;
	}

	public void setTaxis(List<Vehiculo> taxis) {
		this.taxis = taxis;
	}

	public void setTaxi(Taxi taxi) {
		this.taxi = taxi;
	}

	public List<Vehiculo> getTrenes() {
		return trenes;
	}

	public void setTrenes(List<Vehiculo> trenes) {
		this.trenes = trenes;
	}

	public void setTren(Tren tren) {
		this.tren = tren;
	}

	public List<Vehiculo> getAutobuses() {
		return autobuses;
	}

	public void setAutobuses(List<Vehiculo> autobuses) {
		this.autobuses = autobuses;
	}

	public Autobus getAutobus() {
		return autobus;
	}

	public void setAutobus(Autobus autobus) {
		this.autobus = autobus;
	}

	public String getCodigo_vehiculo() {
		return Codigo_vehiculo;
	}

	public void setCodigo_vehiculo(String codigo_vehiculo) {
		Codigo_vehiculo = codigo_vehiculo;
	}

	public String getLicencia() {
		return Licencia;
	}

	public void setLicencia(String licencia) {
		Licencia = licencia;
	}

	public int getCapacidad() {
		return Capacidad;
	}

	public void setCapacidad(int capacidad) {
		Capacidad = capacidad;
	}

	public String getMatricula() {
		return matricula;
	}

	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}

	public String getMarca() {
		return marca;
	}

	public void setMarca(String marca) {
		this.marca = marca;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public String getLinea() {
		return linea;
	}

	public void setLinea(String linea) {
		this.linea = linea;
	}

	
	public String getCodigo_vehiculo1() {
		return Codigo_vehiculo1;
	}

	public void setCodigo_vehiculo1(String codigo_vehiculo1) {
		Codigo_vehiculo1 = codigo_vehiculo1;
	}

	public String getLicencia1() {
		return Licencia1;
	}

	public void setLicencia1(String licencia1) {
		Licencia1 = licencia1;
	}

	public int getCapacidad1() {
		return Capacidad1;
	}

	public void setCapacidad1(int capacidad1) {
		Capacidad1 = capacidad1;
	}

	public String getMatricula1() {
		return matricula1;
	}

	public void setMatricula1(String matricula1) {
		this.matricula1 = matricula1;
	}

	public String getMarca1() {
		return marca1;
	}

	public void setMarca1(String marca1) {
		this.marca1 = marca1;
	}

	public String getModelo1() {
		return modelo1;
	}

	public void setModelo1(String modelo1) {
		this.modelo1 = modelo1;
	}

	public int getLinea1() {
		return linea1;
	}
	

	public String getNombre_linea() {
		return nombre_linea;
	}

	public void setNombre_linea(String nombre_linea) {
		this.nombre_linea = nombre_linea;
	}

	public void setLinea1(int linea1) {
		this.linea1 = linea1;
	}

	
	public boolean isInsertado_v() {
		return insertado_v;
	}

	public void setInsertado_v(boolean insertado_v) {
		this.insertado_v = insertado_v;
	}

	public boolean isExiste_v() {
		return existe_v;
	}

	public void setExiste_v(boolean existe_v) {
		this.existe_v = existe_v;
	}

	public boolean isVacio_v() {
		return vacio_v;
	}

	public void setVacio_v(boolean vacio_v) {
		this.vacio_v = vacio_v;
	}

	public boolean isModif_v() {
		return modif_v;
	}

	public void setModif_v(boolean modif_v) {
		this.modif_v = modif_v;
	}

	public boolean isElim_v() {
		return elim_v;
	}

	public void setElim_v(boolean elim_v) {
		this.elim_v = elim_v;
	}

	public ArrayList<String> li(){
		lic = new ArrayList<String>();
		lic.add("--");
		lic.add("tren");
		lic.add("taxi");
		lic.add("bus");
		return lic;
	}
	
	
	public ArrayList<String> vehiculos() throws Exception{
		Taxi taxi=new Taxi();
		Autobus autobus=new Autobus();
		Tren tren=new Tren();
		Conductor cond=new Conductor();
		List<Persona> conds=cond.getPersonas();
		Revisor rev=new Revisor();
		List<Persona> revs=rev.getPersonas();
		List<Vehiculo> taxis=taxi.getVehiculos();
		List<Vehiculo> trenes=tren.getVehiculos();
		List<Vehiculo> autobuses=autobus.getVehiculos();
		veh = new ArrayList<String>();
		veh.add("--");
		for(int i=0;i<taxis.size();i++)	veh.add(taxis.get(i).getCodigo_vehiculo());
		for(int i=0;i<trenes.size();i++)veh.add(trenes.get(i).getCodigo_vehiculo());
		for(int i=0;i<autobuses.size();i++)veh.add(autobuses.get(i).getCodigo_vehiculo());
		for(int i=0;i<conds.size();i++){
			for(int j=0;j<veh.size();j++){
				if(veh.get(j).equals((((Conductor) conds.get(i)).getTipo_vehiculo()))&&!((Conductor) conds.get(i)).getLicencia().getTipo_licencia().equals("tren")){
					veh.remove(j);
				}
			}
		}
	   for(int i=0;i<conds.size();i++){
		   for(int k=0;k<revs.size();k++){
			for(int j=0;j<veh.size();j++){
				if(veh.get(j).equals((((Conductor) conds.get(i)).getTipo_vehiculo()))&&veh.get(j).equals((((Revisor) revs.get(k)).getTipo_vehiculo()))){
					veh.remove(j);
				}
			}
		   }
		}
		
		return veh;
	}	
public ArrayList<String> tienda() throws Exception{
	Tienda tienda=new Tienda();
	Vendedor vend=new Vendedor();
	List<Persona> vends=vend.getPersonas();
	List<Tienda> tiendas=tienda.getTiendas();
	tie = new ArrayList<String>();
	tie.add("--");
	for(int k=0;k<tiendas.size();k++) tie.add(tiendas.get(k).getTipo_producto());
	for(int i=0;i<vends.size();i++){
		for(int j=0;j<tie.size();j++){
			if(tie.get(j).equals(tienda.consultTiendaporCodigo(((Vendedor) vends.get(i)).gettienda().getCodigo_Tienda()).getTipo_producto())){
				tie.remove(j);
			}
		}
	}
	return tie;
}


public ArrayList<String> linea() throws Exception{
	Linea linea=new Linea();
	Tramo t=new Tramo();
	Tren tr=new Tren();
	Autobus b=new Autobus();
	List<Vehiculo> trenes=tr.getVehiculos();
	List<Vehiculo> buses=b.getVehiculos();
	List<Linea> lineas=linea.getLineas();
	lin = new ArrayList<String>();
	lin.add("--");
	for(int i=0;i<lineas.size();i++){
		if(t.consultarTramos(lineas.get(i).getCodigo_linea())>0)lin.add(lineas.get(i).getnombre());
	}
	for(int i=0;i<trenes.size();i++){
		for(int j=0;j<lin.size();j++){
			if(lin.get(j).equals(linea.consultarLinea(((Tren)trenes.get(i)).getLinea().getCodigo_linea()).getnombre())){
				lin.remove(j);
			}
		}
	}
	for(int i=0;i<buses.size();i++){
		for(int j=0;j<lin.size();j++){
			if(lin.get(j).equals(linea.consultarLinea(((Autobus)buses.get(i)).getLinea().getCodigo_linea()).getnombre())){
				lin.remove(j);
			}
		}
	}
	return lin;
}
	
public List<Estacion> getEstaciones() throws Exception {
	Estacion e=new Estacion();
	return e.getEstaciones();
}

public String getNueva_linea() {
	return nueva_linea;
}

public void setNueva_linea(String nueva_linea) {
	this.nueva_linea = nueva_linea;
}
	
}

